package com.itheima.reggie.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.itheima.reggie.common.R;
import com.itheima.reggie.entity.Category;
import com.itheima.reggie.entity.Setmeal;
import com.itheima.reggie.entity.SetmealDto;
import com.itheima.reggie.service.CategoryService;
import com.itheima.reggie.service.SetmealService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.stream.Collectors;

@Slf4j
@RestController
@RequestMapping("/setmeal")
public class SetmealController {

    @Autowired
    private SetmealService setmealServive;

    /**
     * http://localhost:8080/setmeal
     *
     * @param setmealDto
     * @return post请求
     */
    @PostMapping
    @CacheEvict(value = "setmealCache", allEntries = true)
    public R<String> save(@RequestBody SetmealDto setmealDto) {
        //打印
        log.info("[新增套餐 dto:{}]", setmealDto);
        // 调用SetmealService完成套餐及菜品关系的保存
        // SetmealService没有保存多表的业务方法，需要我们自己扩展
        setmealServive.saveWithDish(setmealDto);
        return R.success("保存成功");
    }

    //http://localhost:8080/setmeal/page?page=1&pageSize=10
    //Get请求
    @GetMapping("/page")
    public R<Page> findByPage(Integer page, Integer pageSize, String name) {
        log.info("[套餐分页查询 page:{},pageSize:{},name:{}]", page, pageSize, name);
        // 分页查询，做简单版，直接调用SetmealService拿分页数据
        // 构建分页对象
        Page pageInfo = new Page(page, pageSize);
        // 添加条件
        LambdaQueryWrapper<Setmeal> queryWrapper = new LambdaQueryWrapper();
        queryWrapper.like(name != null && !name.equals(""), Setmeal::getName, name);
        // 分页查询
        Page page1 = setmealServive.page(pageInfo, queryWrapper);
        // 返回
        return R.success(page1);
    }
    //@GetMapping("/page")
    //public R<Page> setmealPage(Integer page, Integer pageSize, String name) {
    //    //打印
    //    log.info("得到的分页信息:page{},pageSize{},name{}", page, pageSize, name);
    //    //构建分页对象
    //    Page<Setmeal> pageInfo = new Page<>(page, pageSize);
    //    //条件分页展示
    //    LambdaQueryWrapper<Setmeal> queryWrapper = new LambdaQueryWrapper<>();
    //    //添加查询条件，根据name进行like模糊查询
    //    queryWrapper.like(name != null && name.equals(""), Setmeal::getName, name);
    //    //添加条件  展示降序   更新时间降序排列
    //    queryWrapper.orderByDesc(Setmeal::getUpdateTime);
    //    //分页查询
    //    setmealServive.page(pageInfo, queryWrapper);
    //    //这里我们插入套餐展示页面套餐分类
    //    //对象拷贝
    //    //Page<SetmealDto> dtoPage = new Page<>();
    //    ////拷贝方法
    //    //BeanUtils.copyProperties(pageInfo, dtoPage, "records");
    //    //List<Setmeal> records = pageInfo.getRecords();
    //    //for (Setmeal record : records) {
    //    //    SetmealDto setmealDto = new SetmealDto();
    //    //    //对象拷贝
    //    //    BeanUtils.copyProperties(record, setmealDto);
    //    //    //根据分类ID查询分类对象
    //    //    Category cateGory = categoryService.getById(record.getCategoryId());
    //    //    setmealDto.setCategoryName(cateGory != null ? cateGory.getName() : "");
    //    //    records.add(setmealDto);
    //    //}
    //    //log.info("得到的结果数据:{}", records);
    //    //Page<Setmeal> page1 = new Page<>();
    //    //page1.setRecords(records);
    //    //返回
    //
    //    //对象拷贝
    //    Page<SetmealDto> dtoPage = new Page<>();
    //    BeanUtils.copyProperties(pageInfo, dtoPage, "records");
    //    List<Setmeal> records = pageInfo.getRecords();
    //    List<SetmealDto> setmealDtos = records.stream().map((item) -> {
    //        SetmealDto setmealDto = new SetmealDto();
    //        //对象拷贝
    //        BeanUtils.copyProperties(item, setmealDto);
    //        //根据分类id查询分类对象
    //        Category category = categoryService.getById(item.getCategoryId());
    //        setmealDto.setCategoryName(category != null ? category.getName() : "");
    //        return setmealDto;
    //    }).collect(Collectors.toList());
    //    dtoPage.setRecords(setmealDtos);
    //    return R.success(dtoPage);
    //    //return R.success(pageInfo);
    //
    //}

    //批量删除
    //http://localhost:8080/setmeal?ids=1606195607515545601,1606195249447813122
    @DeleteMapping
    @CacheEvict(value = "setmealCache", allEntries = true)
    //这个注解的意思是把setmealCache名字下的所有Redis缓存都删除
    public R<String> delete(@RequestParam List<Long> ids) {
        //打印
        log.info("要删除的套餐ID:{}", ids);
        //先跑通
        //调方法
        setmealServive.removeWithDish(ids);
        return R.success("套餐删除成功!!!");
    }

    /**
     * 根据条件查询套餐数据
     *
     * @param setmeal
     * @return
     */
    @GetMapping("/list")
    //setmealCache::分类的ID_当前分类的状态
    //这里要注意setmealCache是把方法的返回值存入Redis 返回值是有序列化的  但是这个R是没有序列化的
    //我们需要在返回值类(R)里面加上序列化
    @Cacheable(value = "setmealCache", key = "#setmeal.categoryId+'_'+#setmeal.status")
    public R<List<Setmeal>> list(Setmeal setmeal) {
        LambdaQueryWrapper<Setmeal> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(setmeal.getCategoryId() != null, Setmeal::getCategoryId, setmeal.getCategoryId());
        queryWrapper.eq(setmeal.getStatus() != null, Setmeal::getStatus, setmeal.getStatus());
        queryWrapper.orderByDesc(Setmeal::getUpdateTime);

        List<Setmeal> list = setmealServive.list(queryWrapper);
        return R.success(list);
    }
}
